//
//  HMStatusDAL.swift
//  iOSWeibo12
//
//  Created by Admin on 16/9/27.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

class HMStatusDAL: NSObject {
    // 单例
    static let shared = HMStatusDAL()
    
    /// 数据缓存时间
    private let cacheDataTime: TimeInterval = 60 // 7 * 24 * 60 * 60
    
    /**
     清除超过缓存时间的数据
     每当程序退出到后台,检测过时的缓存数据,并清除
     */
    func clearCacheData() {
        // 计算过期数据的日期
        let clearDate = Date(timeIntervalSinceNow: -cacheDataTime)
        
        // 转成和sqlite一样格式的时间
        let df = DateFormatter()
        df.locale = Locale(identifier: "en")
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let dateString = df.string(from: clearDate)
        
        print("clearDate: \(dateString)")
        
        // 确定sql
        let sql = "DELETE FROM T_Status WHERE createTime < '\(dateString)';"
        
        // 删除过期的缓存数据
        HMSQLiteManager.shared.dbQueue.inTransaction { (db, rollback) -> Void in
            if db.executeUpdate(sql) {
                print("删除缓存成功")
            }
        }
    }
    
    // 加载微博数据
    func loadStatus(since_id: Int, max_id: Int, finish: @escaping ([[String: Any]]?, Error?) -> Void) {
        // 1.查看本地是否有缓存数据
        loadCacheData(since_id: since_id, max_id: max_id) { (array) in
            // 2.如果本地有数据,直接返回给调用者
            if let array = array, array.count > 0 {
                print("本地加载 \(array.count)")
                finish(array, nil)
                return
            }
            
            print("网络加载")
            // 3.如果没有缓存数据,去网络加载数据
            // 判断accessToken是否为空
            guard let access_token = HMUserAccountViewModel.shared.userAccount?.access_token else {
                // accessToken为空
                return
            }
            
            // url
            let urlString = "2/statuses/home_timeline.json"
            
            // 参数
            var parameters: [String: Any] = ["access_token": access_token]
            // , "count": 1
            
            if since_id > 0 {
                parameters["since_id"] = since_id
            } else if max_id > 0 {
                // 别人传递了max_id.添加到字典里面
                parameters["max_id"] = max_id - 1
            }
            
            HMNetworkTool.shared.request(method: .GET, URLString: urlString, parameters: parameters, progress: nil, success: { (_, result) in
                
                // 获取返回数据中的微博数据
                if  let dict = result as? [String: Any],
                    let array = dict["statuses"] as? [[String: Any]] {
                    // 4.缓存网络加载的数据到本地数据库
                    self.saveStatus(array: array)
                    
                    // 5.返回数据给调用者
                    finish(array, nil)
                }
                }, failure: { (_, error) in
                    // 5.返回数据给调用者
                    finish(nil, error)
            })
            
        }
    }
    
    /**
     加载缓存微博数据
     parameter since_id: 下拉刷新
     parameter max_id:   上拉加载更多
     */
    func loadCacheData(since_id: Int, max_id: Int, finish: @escaping ([[String: Any]]?) -> Void) {
        // 获取用户的ID
        guard let userId = HMUserAccountViewModel.shared.userAccount?.uid else {
            print("无法获取用户信息")
            return
        }
        
        // 确定sql
        var sql = "SELECT statusId, status, userId FROM T_Status \n" +
        "WHERE userId=\(userId) \n"
        
        // 下拉刷新
        if since_id > 0 {
            sql += "AND statusId > \(since_id) \n"
        }
        
        // 上拉加载更多
        if max_id > 0 {
            sql += "AND statusId < \(max_id) \n"
        }
        
        sql += "ORDER BY statusId DESC LIMIT 20;"
        
        // 打印sql
        print(sql)
        
        HMSQLiteManager.shared.dbQueue.inDatabase { (db) in
            do {
                let result = try db!.executeQuery(sql, values: [])
                
                // 返回微博字典数组
                var array = [[String: Any]]()
                
                // 获取数据
                while result.next() {
                    // 获取微博字段数据
                    let statusString = result.string(forColumn: "status")
                    
                    // String转成字典.  String -> NSData -> JSON
                    let statusData = statusString?.data(using: .utf8)
                    let dict = try JSONSerialization.jsonObject(with: statusData!, options: [])
                    
                    // 添加微博字典到微博数组
                    array.append(dict as! [String : Any])
                }
                
                // 返回微博字典数组
                finish(array)
            } catch {
                finish(nil)
            }
        }
    }
    
    /**
     将网络获取的微博数据保存到本地
     parameter array: 网络返回的微博数据数组
     */
    func saveStatus(array: [[String: Any]]) {
        
        // 获取用户的ID
        guard let userId = HMUserAccountViewModel.shared.userAccount?.uid else {
            print("无法获取用户信息")
            return
        }
        
        // 确定sql语句
        let sql = "INSERT INTO T_Status (statusId, status, userId) VALUES (?, ?, ?);"
        
        // 使用SQLiteManager添加到数据库
        // 因为这里是添加多条记录,所以使用事务
        HMSQLiteManager.shared.dbQueue.inTransaction { (db, rollback) -> Void in
            do {
                // 遍历微博字典数组
                for dict in array {
                    // 获取微博ID
                    let statusId = dict["id"] as! NSNumber
                    
                    // 微博数据是一个字典.需要转成String再存入数据库
                    // 字典转String,使用JSON序列化成data,再转成String
                    let json = try! JSONSerialization.data(withJSONObject: dict, options: [])
                    let status = String(data: json, encoding: .utf8)!
                    
                    // 保存到数据库
                    try db!.executeUpdate(sql, values: [statusId, status, userId])
                }
                
                print("保存了\(array.count)条数据到数据库")
            } catch let error {
                print("保存数据失败: \(error)")
                rollback?.pointee = true
            }
            
        }
    }
}
